<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*
     * 自定义对象
     *  - 增删改查
     *  - 创建对象 new Object()
     *  - 属性添加：使用：对象名.属性名 = 属性值（可以是任意的一种类型） 对象名['属性名'] = 属性值
     *  - 属性修改：使用：对象名.属性名 = 修改值  对象名['属性名'] = 修改值
     *  - 属性获取：使用：对象名.属性名 如果这个属性没有，不会报错，而是会返回 undefined  对象名['属性名']
     *  - 属性删除：使用：delete 对象名.属性名 位置和值全部删除，跟数组不同(只删除值，不删除位置)
     *  - 普通函数的使用一般称为执行函数，对象中的函数的使用一般叫做方法的调用
     *  - 对象方法调用：对象名.方法名()  对象名['方法名']()
     */
    var obj = new Object();
    obj.name = 'levi·akerman';
    obj.sex = '男';
    obj.character = '洁癖，外冷内热，毒舌';
    obj.hobby = '喝红茶,大扫除';
    obj.skill = function () {
      alert('斩杀巨人');
    }
    // console.log(obj);//输出全部
    // console.log(obj.name);//只输出名字levi·akerman
    // delete obj.sex;//删除性别
    // obj['love'] = 'J';//添加属性：爱人


    /*
     * 属性名和属性值
     *  - 属性名没有强制要求使用标识符的规则去定义
     *  - 某些特殊的属性名无法使用 对象名.属性名 的方式进行设置，只能使用 对象名['属性名']
     *  - 对象名[变量名] 可以设置或者获取可变属性名的值
     *  - 属性值可以是任意一种类型的数据
     *  - 对象是否有某个属性用的是 in 操作符，用法：'属性名' in 对象名，如果有返回 true，没有返回 false
     * 
     * 数组遍历
     *  - for 循环
     *  - for in
     *  - for of
     *  - forEach
     * 对象的遍历
     *  - for in
     */
    var _obj = 'name';//配合 console.log(obj[_obj]); 使用，var _obj = 'name'; 中 ''内可为下方定义过的任何属性名
    var obj = new Object();
    obj.name = 'levi·akerman';
    obj.sex = '男';
    obj.character = '洁癖，外冷内热，毒舌';
    obj.hobby = '喝红茶,大扫除';
    obj.skill = function () {
      alert('斩杀巨人');
    }
    console.log(obj[_obj]);

    var arr = ['name','sex','character'];
    for (let v of arr){
      console.log(obj[v]);
    }

    for (let i in obj){
      console.log(obj[i]);
    }

    console.log('name' in obj);



  </script>
</body>

</html>